// internal/planner/api/planner.go
package api

import (
    "NumberBase/internal/parser/ast"
    "NumberBase/internal/planner/types"
    "NumberBase/internal/planner/logical"
    "NumberBase/internal/planner/optimizer"
    "NumberBase/internal/planner/physical"
)

// Planner 是计划生成器的主入口
type Planner struct {
    builder   *logical.Builder
    optimizer *optimizer.Optimizer
    generator *physical.Generator
}

// New 创建新的Planner
func New() *Planner {
    return &Planner{
        builder:   logical.NewBuilder(),
        optimizer: optimizer.New(),
        generator: physical.NewGenerator(),
    }
}

// GenerateLogicalPlan 生成未优化的逻辑计划
func (p *Planner) GenerateLogicalPlan(stmt ast.Statement) (types.LogicalPlan, error) {
    return p.builder.Build(stmt)
}

// OptimizeLogicalPlan 优化逻辑计划
func (p *Planner) OptimizeLogicalPlan(plan types.LogicalPlan) types.LogicalPlan {
    return p.optimizer.Optimize(plan)
}

// GeneratePhysicalPlan 生成物理执行计划
func (p *Planner) GeneratePhysicalPlan(plan types.LogicalPlan) (types.PhysicalPlan, error) {
    return p.generator.Generate(plan)
}

// Plan 一站式生成完整执行计划（逻辑->优化->物理）
func (p *Planner) Plan(stmt ast.Statement) (types.PhysicalPlan, error) {
    // 生成逻辑计划
    logicalPlan, err := p.GenerateLogicalPlan(stmt)
    if err != nil {
        return nil, err
    }
    
    // 优化逻辑计划
    // optimizedPlan := p.OptimizeLogicalPlan(logicalPlan)
    
    // 生成物理计划
    physicalPlan, err := p.GeneratePhysicalPlan(logicalPlan)
    if err != nil {
        return nil, err
    }
    
    return physicalPlan, nil
}